package persistencia.derby;

import io.SubscriptionDTO;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import persistencia.DAOException;
import persistencia.DAOFactory;
import persistencia.SubscriptionDAO;

/**
 * Clase que implementa los métodos para trabajar con objetos de la clase
 * io.SubscriptionDTO. Implementa la interface SubscriptionDAO.
 *
 * @author Nicolás Garay
 * @author Alejandro Jacquet
 * @author Rita Romani
 */
public class DerbySubscriptionDAO implements SubscriptionDAO {

    /**
     * Método que devuelve una lista con objetos de io.SubscriptionDTO.
     *
     * @return List<SubscriptionDTO>
     * @throws DAOException excepción lanzada por la Base de Datos (Mensaje:
     * Error al leer las subscripciones desde la base de datos).
     */
    @Override
    public List<SubscriptionDTO> listarSubscription() throws DAOException {
        Connection conexion = null;
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            conexion = factory.getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from subscription");
            ArrayList<SubscriptionDTO> lista = new ArrayList();
            while (rs.next()) {
                SubscriptionDTO subscription = new SubscriptionDTO(rs.getString("nombre"), rs.getString("direccion"), Integer.parseInt(rs.getString("activo")) == 1);
                lista.add(subscription);
            }
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer las subscripciones desde la base de datos", e);
        } finally {
            DAOFactory.getDAOFactory().closeConexion(conexion);
        }
    }

    /**
     * Método que inserta una nueva suscripción en la Base de Datos.
     *
     * @param nombre String nombre de la suscripción (unívoco)
     * @param direccion String url de la suscripción
     * @param activo boolean determina si la suscripción se encuentra activa o
     * no
     * @throws DAOException excepción lanzada por la Base de Datos (Mensaje:
     * Error al insertar una nueva suscripción en la base de datos).
     */
    @Override
    public void insertarSubscription(String nombre, String direccion, boolean activo) throws DAOException {

        Connection conexion = null;
        try {
            int activoInteger;
            if (activo) {
                activoInteger = 1;
            } else {
                activoInteger = 0;
            }
            conexion = DAOFactory.getDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("insert into subscription(nombre,direccion,activo) values ('" + nombre + "','" + direccion + "'," + activoInteger + ")");
        } catch (SQLException e) {
            throw new DAOException("Error al insertar una nueva suscripción en la base de datos", e);
        } finally {
            DAOFactory.getDAOFactory().closeConexion(conexion);
        }
    }

    /**
     * Método que elimina una suscripción de la Base de Datos.
     *
     * @param nombre String nombre (unívoco) de la suscripción a eliminar
     * @return boolean determina si la suscripción fue eliminada correctamente o
     * no
     * @throws DAOException excepción lanzada por la Base de Datos (Mensaje:
     * Error al borrar la suscripción en la base de datos).
     */
    @Override
    public boolean eliminarSubscription(String nombre) throws DAOException {
        Connection conexion = null;
        try {
            conexion = DAOFactory.getDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            if (stat.executeUpdate("delete from subscription where nombre ='" + nombre + "'") == 0) {
                return false;
            } else {
                return true;
            }
        } catch (SQLException e) {
            throw new DAOException("Error al borrar la suscripción en la base de datos", e);
        } finally {
            DAOFactory.getDAOFactory().closeConexion(conexion);
        }
    }

    /**
     * Método que modifica una suscripción en la Base de Datos.
     *
     * @param nombreActual String nombre actual de la suscripción.
     * @param nombreNuevo String nombre nuevo de la suscripción.
     * @param direccion String url de la suscripción
     * @param activo boolean determina si la suscripción se encuentra activa o
     * no
     * @throws DAOException excepción lanzada por la Base de Datos (Mensaje:
     * Error al actualizar la suscripción en la base de datos).
     */
    @Override
    public void actualizarSubscription(String nombreActual, String nombreNuevo, String direccion, boolean activo) throws DAOException {
        Connection conexion = null;
        try {
            int activoInteger;
            if (activo) {
                activoInteger = 1;
            } else {
                activoInteger = 0;
            }
            conexion = DAOFactory.getDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("update subscription set nombre = '" + nombreNuevo + "',direccion = '" + direccion + "',activo = " + activoInteger + " where nombre = '" + nombreActual + "'");
        } catch (SQLException e) {
            throw new DAOException("Error al actualizar la suscripción en la base de datos", e);
        } finally {
            DAOFactory.getDAOFactory().closeConexion(conexion);
        }
    }
}
